﻿#ifndef AIPTUSTRUCT_H
#define AIPTUSTRUCT_H

/*
* @author   Puuck
* @date     2020-10-17
*/

#include <QString>
#include <QList>

#include "DrawForm.h"

#define MAX_USERNAME_LEN                32

struct ChnInfo
{
    QString  chnid;          //通道ID
    QString  eventType;      //事件类型
    QString  alarmType;      //报警类型
    QString  ipcIp;          //IPC IP地址
    QString  ipcUser;        //IPC 用户名
    QString  ipcPassword;    //IPC 密码
    QString  streamUrl;       //实时流地址
    int enable;
    int online;

};
struct DeviceInfo
{
    QString hw;          // 硬件版本
    QString sw;          // 软件版本
    QString algover;     // 算法库版本
    QString modVer;      // 模型版本
    QString fwVer;       //固件版本
    QString devType;     //设备类型
    QString sn;          // sn
    QString devId;       //设备ID
    int     cntchn;      //用到的通道数
    ChnInfo  chnInfo[15];
};

struct DeviceRunInfo
{
    QString dayTime;    // 设备系统时间
    int cpuUsage;       // cpu使用占用空间比例
    int ramUsage;       // ram使用占用空间比例
    int diskUsage;      // 磁盘使用占用空间比例
    float temp;         // 温度
};

#pragma pack(1)    // 字节对齐
struct WsBinHeader
{
    int16_t tag;             // 消息类型
    int32_t totalSize;       // 文件总长度，不含包头
    int32_t sliceSize;       // 当前包含数据长度，不含包头
    int32_t sliceSeq;        // 包序列号
    int64_t ts;              // 物理时钟，单位为毫秒
    uint8_t reserved[62];    // 保留
    uint8_t chn;             // 通道号，服务器 0~63
    uint8_t alarmExtern;     // 值为0xa5时含报警信息拓展，8k bytes 否则无拓展信息
};

struct ImageHeader
{
    uint8_t type;         // 1、原始图片 2、检测输出、带分析/报警信息 3、煤量 4、文件形式、截图
    char filename[50];    // 2、文件名
    int32_t idx;          // 3、发送第几张图片，实时图像不设此参数
    int32_t total;        // 4、共需要上传数量
};
#pragma pack()

struct AlarmExtern
{
    QString chnId;            // 设备ID或通道号，针对服务器，视频通道0 ~ 63
    QString startTime;       // 开始时间，物理时钟，单位为毫秒
    QString stopTime;        // 结束时间，<=0 表示还没有结束
    QString alarmType;         // 告警类型
    QString alarmImageId;    // 报警图片id
    QString desc;              // 描述
    int alarmGrade;              // 级别，取值范围为0 ~ 10，0最高
    int peolpeCount;            //检测人数
    QString boxes;             // 报警框
    int steps;                 // 0 报警、巡检开始 1 连续报警、巡检中 2 巡检结束
    QString zones;             // 报警检测区域
    QString lines;             // 警戒线
};

enum WSIMAGE_TYPE
{
    WSIMAGE_TYPE_NULL = 0,
    WSIMAGE_TYPE_ORIGIN,         // 原始图片
    WSIMAGE_TYPE_DETECTOR,       // 检测输出 //煤量调速
    WSIMAGE_TYPE_COAL,           // 煤量
    WSIMAGE_TYPE_FILE,           // 文件形式，截图
//    WSIMAGE_TYPE_COALSPD_IMG,    // 调速+原始图
//    WSIMAGE_TYPE_COALSPD_SIM,    // 调速+模拟图
};

struct CameraInfo
{
    int fps;       // 帧率
    int seq;       // 序列
    int width;     // 宽度
    int height;    // 高度
};

struct RegionOfInterest
{
    int x;
    int y;
    int w;
    int h;
};

struct CameraParam
{
    int expose;              // 曝光
    int gain;                // 增益
    RegionOfInterest roi;    // 感兴趣区域
};

struct NetworkParam
{
    QString devtype;//设备类型
    QString port;
    QString sn;
};

struct RefBox
{
    QString name;
    int grade;
    float x;
    float y;
    float w;
    float h;
};

struct ZonePoint
{
    int id;
    float x;
    float y;
};

struct Zone
{
    QString name;
    int grade;
    QList<ZonePoint> zonePoints;
};

struct AlarmOut
{
    int alarmId;    // 1:大块 2:锚杆 3:水煤 4:异物
    int enable;     // 使能
    int io;         // 1:O1 2:O2 3:O3 4:O4
};

struct DetBeltParam
{
    int enable;                  // 使能
    float thresh;                // 检测阈值
    int alarmRefId;              // 报警等级
    int refBoxCnt;               // 报警尺寸数量
    QList<RefBox> refBoxs;       // 报警尺寸坐标点
    int zoneCnt;                 // 检测区域数量
    QList<Zone> zones;           // 检测区域坐标点
    QList<AlarmOut> alarmOut;    // 干结点测试
    int lineCnt;                 // 警告线数量
    QList<QLineF> lines;         // 警告线
};

struct DetPeopleParam
{
    int enable;                         // 使能
    float thresh;                       // 检测阈值
    int chn;                            // 通道号，对接服务器
    int source;                         // 1:rtsp 2:file
    QString uuid;                       // 设备uuid，对接服务器
    QString uri;                        // rtsp地址或文件地址
    int algoType;                       // 算法类型
    int alarmGrade;                     // 报警等级 1:最高 2:中等 3:一般
    int alarmConfirmTime;               // 报警确认时间
    int alarmLeaveTime;                 // 报警消除时间
    int peopleMax;                      // 最大允许人数，0表示不允许有人
    int rollerCnt;                      // 托辊数量
    int holdCnt;                        // 支护数量
    int lineCnt;                        // 警告线数量
    QList<DrawForm::DrawLine> lines;    // 警告线
    int zoneCnt;                        // 区域数量
    QList<Zone> zones;                  // 检测区域
};

struct AlgoSet
{
    QString chnid;   //通道ID
    int enable;                         // 使能
    int online;                         //状态
    float thresh;                       // 检测阈值
    QString url;                        // rtsp地址或文件地址
    QString eventType;                  //事件类型
    QString alarmType;                  // 报警类型
    int alarmGrade;                     // 报警等级 1:最高 2:中等 3:一般
    QString ipcIp;                      //IPC IP地址，仅中低速分析相机有效
    QString ipcUser;                    //IPC 用户名，仅中低速分析相机有效
    QString  ipcPassword;               //IPC 密码，仅中低速分析相机有效

    int linkIoIn;                       //0：取消关联IO输入 1：关联IO输入
    int linkPlc;                        //0：取消关联PLC信息 1：关联PLC信息
    int  plcPort;                       //PLC通信端口 默认：3000
    int  cascadeMode;                   //0:关闭级联 1:级联主设备 2:级联从设备
    QString devIp;                      //对应主设备IP地址 设置为级联从设备时，需填写对应主设备的IP地址
    int modbusOut;                      //0:禁用modbus输出 1:使能modbus输出

    int  zone;                          //第几个区域：0-9（最大值）
    int enUpProtocol;                   //0：禁用协议上报 1：使能协议上报
    int enSpeaker;                      //0：禁用语音输出 1：使能语音输出
    //ioOut                             //{"out_0":1, "out_1":1, "out_2":0, "out_3":0}	干节点输出，0：禁用输出 1：使能输出
    int maxPeople;                      //最大允许人数0：表示不允许有人
    float distanceMin;                  //距离检测允许得最小距离（单位：米）
    float distanceMax;                  //距离检测允许得最大距离（单位：米）

    int lineCnt;                        // 警告线数量
    QList<DrawForm::DrawLine> lines;    // 警告线
    int zoneCnt;                        // 区域数量
    QList<Zone> zones;                  // 检测区域
};


struct AppUpgrade
{
    QString filename;    // 文件名
    QString md5;         // 校验码
    int step;            // 1：下载文件 2：校验 3：升级文件 4：重启程序
    int pct;             // 进度
};

struct CoalSpdParam
{
    int thresh_auto;           // 1：自动阈值 0：手动阈值
    int thresh;                // 阈值 1~255
    QList<Zone> maxRefZone;    // 最大100%区域
    int func;                  // 0：调速 1：精确煤量
    float factor;              // 精确煤量系数
};

struct CoalSpdImage
{
    int imageType;       // 0：原始图 1：二值化图
    int showBaseLine;    // 0：不显示 1：显示
};

struct CoalSpdValue
{
    float coalVolume;    // 实时煤量，百分比
    int coalGrade;       // 煤量等级
    int64_t beltTs;      // 当前煤量时间戳
    float beltVolume;    // 皮带精确煤量 10S 更新一次
    float beltSpd;       // 皮带速度
};

struct OfflineSnapParam
{
    int enable;        // 使能
    QString path;      // 截图存储路径
    float interval;    // 截图间隔
    int maxCapSize;    // 采集容量上限
    int dirSize;       // 当前目录容量
};

struct AIServerParam
{
    int enable;
    QString ip;
    int port;
    QString devid;
};

struct HYPLCParam
{
    int enable;
    QString ip;
    int port;
};

struct AiFaceParam
{
    QString  uuid; //员工唯一标识，用于人脸识别做对应关系
    QString face_image_path;//人脸图片存储位置（提交时填空）
    QString name; //员工姓名
    QString work_number;  //员工编号
    QString id_number;  //员工身份证号
    QString phone;  //员工联系方式
    QString department;  //员工部门
    QString memo_fir;  //备用字段
    QString memo_sec;  //备用字段
    QString memo_thi;  //备用字段
    int id;  //修改与删除id号
};

struct AiChannelParam
{
    QString ip; // IPC IP
    QString username; // IPC 用户名
    QString password; // IPC 密码
    QString url; // IPC 流地址
    int dev_type; // 设备类型：0：海康；1：大华
    QString voice_ip; // 语音播报地址
    int enable; // 通道使能：1：使能；0：非使能
    int preview; // 通道预览：1：预览；0：非预览
    QString memo_fir; // 备用字段
    QString memo_sec; // 备用字段
    QString memo_thi; // 备用字段
    int id;
};



#include <QString>

const QString MULTICAST_ADDR("225.192.168.225");
constexpr int MULTICAST_PORT = 9002;
constexpr int MAX_CONTENT_LEN =  256;


// 通信协议
enum ConnProtocol
{
    DEVICE_DISCOVER_CMD = 0,    // 设备发现
    DEVICE_DISCOVER_CMD_RESP,   // 回复设备发现
    DEVICE_SET_MACETH0,         // eth0
    DEVICE_SET_MACETH1,         // eth1
    DEVICE_SET_BOARDID,         // 板卡ID
    DEVICE_SET_BOARDMODEL,      // 板卡型号
    DEVICE_SET_DATE,            // 生产日期
    DEVICE_SET_CODE,            // 厂商代码
    DEVICE_SET_DEVMODEL,        // 设备型号
    DEVICE_SET_REGIST,          // 激活信息
    DEVICE_SET_JSON,             // Json

    DEVICE_SET_NETWORK_CMD = 24,      //设置网络参数
    DEVICE_SET_NETWORK_CMD_RESP,    //回复设置网络参数
    DEVICE_GET_NETWORK_CMD,      //获取网络参数
    DEVICE_GET_NETWORK_CMD_RESP,    //回复获取网络参数
    DEVICE_SET_REBOOT_CMD,            //重启
    DEVICE_SET_REBOOT_CMD_RESP            //重启 回复
};

#pragma pack(1)  //指定一字节对齐
typedef struct
{
    char mac0[32];  //eth0 mac
    char mac1[32];  //eth1 mac
    char sn[32];    //板卡SN
    char devType[32];//板卡类型
    char date[32];      //生产日期
    char vendorCode[32];//厂商代码
    char unitType[32];//设备型号
} DeviceInfoStruct;
typedef struct
{
    char ptop[4];
    short ocmd;
    char code;
    char sdy[8];
    int contentLen;
    int sdz;
    char contentstr[MAX_CONTENT_LEN];
} DevScan;

typedef struct NetParam
{
    char ip[32];
    char mask[32];
    char gateway[32];
    char sub_ip[32];
    char dns0[32];
    char dns1[32];
} NetParam;
#pragma pack()  //取消指定对齐，恢复缺省对齐


#endif    // AIPTUSTRUCT_H
